#include <stdlib.h>
#include "MyAssert.h"
#include "DynamicArray.h"

// 存储的数据类型
typedef int DataType;

// 单链表节点
typedef struct SingleLinkedListNode
{
    // 节点存放的值
    DataType val;
    // 指向下一个节点的指针
    struct SingleLinkedListNode *next;
} SingleLinkedListNode;

typedef struct SingleLinkedList
{
    // 链表的长度
    int size;
    // 头指针(next 指向第一个节点)
    SingleLinkedListNode *head;
    // 尾指针(指向最后一个节点)
    SingleLinkedListNode *tail;
} SingleLinkedList;

// 创建一个节点
SingleLinkedListNode *newSingleLinkedListNode(DataType val);

// 创建一个节点 并指定其next指针
SingleLinkedListNode *newSingleLinkedListNode(DataType val,SingleLinkedListNode* next);

// 初始化一个单链表
SingleLinkedList *newSingleLinkedList();

// 销毁单链表
void destroy(SingleLinkedList *list);

// 通过数组 初始化一个单链表
SingleLinkedList *newSingleLinkedList(DataType *arr, int size);

// 打印单链表
void printSingleLinkedList(SingleLinkedList *list);

// 通过 DynamicArray 初始化一个单链表
SingleLinkedList *newSingleLinkedList(DynamicArray *arr);

// 向某一节点后插入一个元素
void insertAfter(SingleLinkedList *list, SingleLinkedListNode *node, DataType val);

// 向单链表尾部插入一个元素
void pushBack(SingleLinkedList *list, DataType val);

// 删除某一节点后的节点
void removeAfter(SingleLinkedList *list, SingleLinkedListNode *node);

// 查找某一个元素在单链表中的位置
SingleLinkedListNode *find(SingleLinkedList *list, DataType val);

// 更新某一节点的值
void update(SingleLinkedListNode *node, DataType val);